import JSZip from 'jszip'

/**
 * @typedef {Object} ModelFileInfo
 * @property {string} name - 文件名
 * @property {string} path - 文件路径
 * @property {number} size - 文件大小（字节）
 * @property {'glb'|'gltf'} type - 文件类型
 * @property {boolean} selected - 是否选中
 * @property {Blob} [blob] - 文件Blob数据
 * @property {string} [productName] - 产品名称
 * @property {string} [category] - 分类
 * @property {string} [description] - 描述
 * @property {File|null} [surfacePlot] - 封面图片
 */

/**
 * @typedef {Object} ZipParseResult
 * @property {boolean} success - 是否成功
 * @property {string} [error] - 错误信息
 * @property {ModelFileInfo[]} modelFiles - 模型文件列表
 * @property {number} totalFiles - 总文件数
 * @property {number} modelFileCount - 模型文件数量
 * @property {number} otherFileCount - 其他文件数量
 */

/**
 * 解析ZIP文件
 * @param {File} zipFile - ZIP文件
 * @returns {Promise<ZipParseResult>}
 */
export async function parseZipFile(zipFile) {
  try {
    if (!zipFile.name.toLowerCase().endsWith('.zip')) {
      throw new Error('文件必须是ZIP格式')
    }

    if (zipFile.size > 500 * 1024 * 1024) {
      throw new Error('ZIP文件大小不能超过500MB')
    }

    const zip = new JSZip()
    const zipContent = await zip.loadAsync(zipFile)
    const allFiles = Object.keys(zipContent.files)
    const modelFiles = []
    let otherFileCount = 0

    for (const filePath of allFiles) {
      const zipFile = zipContent.files[filePath]
      
      if (!zipFile || zipFile.dir) continue

      const fileName = filePath.split('/').pop() || ''
      const fileExtension = fileName.toLowerCase().split('.').pop()

      if (fileExtension === 'glb' || fileExtension === 'gltf') {
        try {
          const fileData = await zipFile.async('blob')
          modelFiles.push({
            name: fileName,
            path: filePath,
            size: fileData.size,
            type: fileExtension,
            selected: true,
            blob: fileData
          })
        } catch (error) {
          otherFileCount++
        }
      } else {
        otherFileCount++
      }
    }

    if (modelFiles.length === 0) {
      throw new Error('ZIP文件中未找到GLB或GLTF格式的3D模型文件')
    }

    modelFiles.sort((a, b) => b.size - a.size)

    return {
      success: true,
      modelFiles,
      totalFiles: allFiles.length,
      modelFileCount: modelFiles.length,
      otherFileCount
    }

  } catch (error) {
    return {
      success: false,
      error: error.message || 'ZIP文件解析失败',
      modelFiles: [],
      totalFiles: 0,
      modelFileCount: 0,
      otherFileCount: 0
    }
  }
}

/**
 * 格式化文件大小
 * @param {number} bytes - 字节数
 * @returns {string}
 */
export function formatFileSize(bytes) {
  if (bytes === 0) return '0 B'
  const k = 1024
  const sizes = ['B', 'KB', 'MB', 'GB']
  const i = Math.floor(Math.log(bytes) / Math.log(k))
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
}

/**
 * 获取文件类型图标
 * @param {'glb'|'gltf'} fileType - 文件类型
 * @returns {string}
 */
export function getFileTypeIcon(fileType) {
  return fileType === 'glb' ? '📦' : '📄'
}

